package io.gitee.wl4837.alatool.core.util;

import cn.hutool.core.util.ObjUtil;
import io.gitee.wl4837.alatool.core.getter.MethodBaseFieldGetter;
import io.gitee.wl4837.alatool.core.lang.JsNull;
import io.gitee.wl4837.alatool.core.lang.JsUndefined;
import io.gitee.wl4837.alatool.core.lang.JsVar;

/**
 * 对象工具类，包括判空、克隆、序列化等操作
 *
 * @author Kingood
 */
public class ObjectUtil extends ObjUtil {

    /**
     * 获取实例属性名称
     *
     * @param methodFieldGetter 对象字段
     * @param <P>               类
     * @param <R>               属性
     * @return 实例属性名称
     */
    public static <P, R> String getMethodName(MethodBaseFieldGetter<P, R> methodFieldGetter) {
        try {
            return methodFieldGetter.getMethodName();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 检查对象是否不为null
     * <pre>
     * 1. != null
     * 2. not equals(null)
     * </pre>
     *
     * @param obj 对象
     * @return 是否为非null
     */
    @SuppressWarnings("all")
    public static boolean isNotNull(Object obj) {
        //noinspection ConstantConditions
        if (obj instanceof JsNull) {
            return false;
        } else {
            return null != obj && !obj.equals(null);
        }
    }

    /**
     * 检查对象是否为null<br>
     * 判断标准为：
     *
     * <pre>
     * 1. == null
     * 2. equals(null)
     * </pre>
     *
     * @param obj 对象
     * @return 是否为null
     */
    @SuppressWarnings("all")
    public static boolean isNull(Object obj) {
        //noinspection ConstantConditions
        if (obj instanceof JsNull) {
            return true;
        } else {
            return null == obj || obj.equals(null);
        }
    }

    /**
     * 检查对象是否不为undefined
     * <pre>
     * 1. != undefined
     * </pre>
     *
     * @param obj 对象
     * @return 是否为非undefined
     */
    public static boolean isNotUndefined(Object obj) {
        //noinspection ConstantConditions
        return null != obj && !(obj instanceof JsUndefined);
    }

    /**
     * 检查对象是否为undefined<br>
     * 判断标准为：
     *
     * <pre>
     * 1. == undefined
     * </pre>
     *
     * @param obj 对象
     * @return 是否为undefined
     */
    public static boolean isUndefined(Object obj) {
        //noinspection ConstantConditions
        return null == obj || obj instanceof JsUndefined;
    }

}
